﻿Imports System.Threading
Imports System.Data
Imports System.IO
Imports System.Text
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Interop
Imports System.Collections.ObjectModel

Class CAPIAssetAllocation
    Private ordenEnEdicion As COrden
    Private blnCargada As Boolean = False
    Private APIServicio As New CAPIAssetAllocationServicio()
    Private dtOrdenes As New System.Data.DataTable()
    Private dtCabecera As New System.Data.DataTable()
    Private dtDetalle As New System.Data.DataTable()
    Private dtPie As New System.Data.DataTable()
    Private servGrales As New CServiciosGenerales()
    Dim obsOrdenes As New ObservableCollection(Of COrden)
    Dim blnCambioTipo As Boolean = True

#Region "Carga página"
    Private Sub CMAPIAssetAllocation_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            grdOrdenes.ItemsSource = obsOrdenes

            dtOrdenes.Columns.Add("Contador")
            dtOrdenes.Columns.Add("Campo1")
            dtOrdenes.Columns.Add("Campo2")

            blnCargada = True

            Mouse.OverrideCursor = Nothing
        Catch ex As Exception
            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página API Asset Allocation", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Operativa órdenes"
    Private Sub grdOrdenes_MouseRightButtonUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdOrdenes.MouseRightButtonUp
        Dim objDepend As DependencyObject = e.OriginalSource
        Dim celda As DataGridCell = Nothing

        Me.grdOrdenes.ContextMenu = Nothing
        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend
                If celda.IsSelected = False Then
                    Me.grdOrdenes.UnselectAllCells()
                    celda.IsSelected = True
                End If

                celda.Focus()

                If celda.TabIndex <> 15 Then
                    Me.grdOrdenes.ContextMenu = AgregarMenuContextual(0)
                End If

                Exit While
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Function AgregarMenuContextual(ByVal opcion As Integer) As ContextMenu
        Dim miMenuContextual As New ContextMenu
        Dim mnuCopia As New System.Windows.Controls.MenuItem
        Dim mnuPegar As New System.Windows.Controls.MenuItem
        Dim mnuInsertar As New System.Windows.Controls.MenuItem

        mnuCopia.Header = "Copiar"
        miMenuContextual.Items.Add(mnuCopia)
        AddHandler mnuCopia.Click, AddressOf mnuCopiar_click

        mnuInsertar.Header = "Insertar registros al final"
        miMenuContextual.Items.Add(mnuInsertar)
        AddHandler mnuInsertar.Click, AddressOf mnuInsertar_click

        'Este case esta preparado para extender la funcionalidad de las opciones del menú contextual
        Select Case opcion
            Case 0
                mnuPegar.Header = "Pegar"
                miMenuContextual.Items.Add(mnuPegar)
                AddHandler mnuPegar.Click, AddressOf mnuPegar_click
        End Select

        Return miMenuContextual
    End Function

    Private Sub mnuPegar_click(sender As Object, e As RoutedEventArgs)
        Try
            pegarDatos(Me.grdOrdenes)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub

    Private Sub mnuCopiar_click(sender As Object, e As RoutedEventArgs)
        Try
            If copiarCeldas(Me.grdOrdenes) = False Then
                MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
            End If
        Catch ex As Exception
            MessageBox.Show("Error TI500. Al intentar copiar celdas: " & ex.Message, "Copiado celdas", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub mnuInsertar_click(sender As Object, e As RoutedEventArgs)
        Try
            InsertarDatos(Me.grdOrdenes)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Insertar registros", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub

    Private Sub btnAgregarOrden_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnAgregarOrden.Click
        Dim ordenNueva As COrden = New COrden("Contrato", "TipoValor", "Emisora", "Serie", "0", "TipoOperacion", "0", "0", "0", "SecuritySN", "MaturityRange", "Mesa", "Estrategia", "0", "FechaLiquidacion")
        Dim lstOrdenes As New ObservableCollection(Of COrden)

        grdOrdenes.UnselectAllCells()
        grdOrdenes.UpdateLayout()

        lstOrdenes = grdOrdenes.ItemsSource
        lstOrdenes.Add(ordenNueva)

        grdOrdenes.ScrollIntoView(grdOrdenes.Items(grdOrdenes.Items.Count - 1))
        grdOrdenes.UpdateLayout()

        Dim celda As DataGridCell = ObtenerCelda(grdOrdenes, grdOrdenes.Items.Count - 1, 0)
        If Not celda Is Nothing Then
            celda.Focus()
            grdOrdenes.BeginEdit()
            celda.IsSelected = True
        End If

        ValidaCantidadDatos()
    End Sub

    Private Sub btnEliminaOrden_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnEliminaOrden.Click
        Dim ordenes As ObservableCollection(Of COrden) = grdOrdenes.ItemsSource
        Dim ordenEliminar As New ObservableCollection(Of COrden)
        Dim ordenAgregado As New COrden()
        Dim ordenRecorrido As New COrden()

        If grdOrdenes.SelectedCells.Count > 0 Then
            For Each celda As DataGridCellInfo In grdOrdenes.SelectedCells
                ordenEliminar.Add(CType(celda.Item, COrden))
            Next

            For Each T As COrden In ordenEliminar
                ordenes.Remove(T)
            Next

            grdOrdenes.UpdateLayout()
        Else
            Dim msgBorrado As MessageBoxResult

            msgBorrado = MessageBox.Show("¿Desea borrar todos los registros no utilizados?", "Borrado ordenes", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If (msgBorrado = MessageBoxResult.Yes) Then
                For Each ctAux As COrden In ordenes
                    If ctAux.Contrato = "Contrato" And ctAux.TipoValor = "TipoValor" And ctAux.Emisora = "Emisora" And ctAux.Serie = "Serie" And ctAux.TipoOperacion = "TipoOperacion" And ctAux.LimitYield = "0" And ctAux.Monto = "0" And ctAux.SecuritySN = "SecuritySN" And ctAux.MaturityRange = "MaturityRange" And ctAux.Mesa = "Mesa" And ctAux.Estrategia = "Estrategia" Then
                        ordenEliminar.Add(ctAux)
                    End If
                Next

                For Each T As COrden In ordenEliminar
                    ordenes.Remove(T)
                Next

                grdOrdenes.UpdateLayout()
                grdOrdenes.Items.Refresh()
            End If
        End If

        ValidaCantidadDatos()
    End Sub

    Private Function ObtenerCelda(ByRef miDataGrid As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As DataGridCell
        Try
            Dim row As DataGridRow = miDataGrid.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As Object = miDataGrid.Columns(indexCol).GetCellContent(row)

            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing

                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend
                    Return celda
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While
        Catch ex As Exception
            Throw ex
        End Try

        Return Nothing
    End Function

    Private Sub grdOrdenes_BeginningEdit(sender As System.Object, e As System.Windows.Controls.DataGridBeginningEditEventArgs) Handles grdOrdenes.BeginningEdit
        ordenEnEdicion = grdOrdenes.CurrentItem
    End Sub

    Private Sub grdOrdenes_CellEditEnding(sender As System.Object, e As System.Windows.Controls.DataGridCellEditEndingEventArgs) Handles grdOrdenes.CellEditEnding
        Dim ordenCambio As COrden = New COrden()
        Dim ordenActual As COrden
        Dim ordenes As ObservableCollection(Of COrden) = grdOrdenes.ItemsSource

        Select Case e.EditAction
            Case DataGridEditAction.Cancel
                ordenCambio = TryCast(grdOrdenes.Items(grdOrdenes.Items.Count - 1), COrden)

                If ordenCambio.EsEditableNuevo Then
                    ordenes.Remove(ordenCambio)
                    grdOrdenes.UpdateLayout()
                End If
            Case DataGridEditAction.Commit
                If Not sender.CurrentItem Is Nothing Then
                    Dim txtContenidoCelda As Object = sender.Columns(e.Column.DisplayIndex).GetCellContent(sender.CurrentItem)
                    Dim Columna As Integer = e.Column.DisplayIndex
                    ordenActual = TryCast(grdOrdenes.CurrentCell.Item, COrden)

                    Try
                        If Columna = 4 Then
                            DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text = Convert.ToDouble(DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text).ToString("###,##0")
                        ElseIf Columna = 8 Then
                            If cmbTipo.SelectedIndex = 0 Then
                                DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text = Convert.ToDouble(DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text).ToString("###,##0")
                            ElseIf cmbTipo.SelectedIndex = 1 Then
                                DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text = Convert.ToDouble(DirectCast(txtContenidoCelda, System.Windows.Controls.TextBox).Text).ToString("###,##0.00")
                            End If
                        End If
                    Catch ex As Exception
                    End Try

                    'If traspasoActual.Equals(traspasoEnEdicion) = False Then
                    '    CType(sender, DataGrid).CancelEdit(DataGridEditingUnit.Cell)
                    'End If

                    ordenActual.EsEditableNuevo = False
                End If
        End Select

        ordenEnEdicion = Nothing
    End Sub

    Private Sub grdOrdenes_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles grdOrdenes.PreviewKeyDown
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.C Then
            Try
                If copiarCeldas(Me.grdOrdenes) = False Then
                    MessageBox.Show("El rango de celdas seleccionado no es correcto, si está editando la celda favor de cancelar la edición y proceder con el copiado.", "Copiar celdas", MessageBoxButton.OK, MessageBoxImage.Exclamation)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. Al intentar copiar celdas: " & ex.Message, "Copiado", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
        If Keyboard.Modifiers = ModifierKeys.Control AndAlso e.Key = Key.V Then
            Try
                Dim col As Integer = Me.grdOrdenes.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenes.Items.IndexOf(CType(Me.grdOrdenes.CurrentCell.Item, COrden))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenes, row, col)

                Me.grdOrdenes.CancelEdit()
                pegarDatos(Me.grdOrdenes)

            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Pegar celdas", MessageBoxButton.OK, MessageBoxImage.Error)

                Me.grdOrdenes.CancelEdit(DataGridEditingUnit.Cell)
            End Try
        End If
        If e.Key = Key.Delete Then
            Try
                Dim col As Integer = Me.grdOrdenes.CurrentCell.Column.DisplayIndex
                Dim row As Integer = Me.grdOrdenes.Items.IndexOf(CType(Me.grdOrdenes.CurrentCell.Item, COrden))
                Dim celda As DataGridCell = ObtenerCelda(Me.grdOrdenes, row, col)

                If celda.IsEditing = False Then
                    BorraDatosSeleccionados(Me.grdOrdenes)
                End If
            Catch ex As Exception
                MessageBox.Show("Error TI500. " & ex.Message, "Borrar contenido de celdas", MessageBoxButton.OK, MessageBoxImage.Error)
            End Try
        End If
    End Sub

    Private Sub BorraDatosSeleccionados(ByRef gridDeDatos As DataGrid)

        Dim lstInterAux As ObservableCollection(Of COrden)

        lstInterAux = gridDeDatos.ItemsSource

        Try
            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                Dim col As Integer = celda.Column.DisplayIndex
                Dim row As Integer = gridDeDatos.Items.IndexOf(CType(celda.Item, COrden))

                Dim rowData As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(row)
                Dim cellContent As TextBlock = gridDeDatos.Columns(col).GetCellContent(rowData)
                cellContent.Text = COrden.ValorInicalColumna(col)

                lstInterAux(row)(col) = COrden.ValorInicalColumna(col)
            Next

        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Private Function copiarCeldas(ByRef gridDeDatos As DataGrid) As Boolean
        Try
            Dim lstInterAux As ObservableCollection(Of COrden) = gridDeDatos.ItemsSource
            Dim datos As New System.Text.StringBuilder
            Dim copiadoCorrecto As Boolean = True
            Dim colIni As Integer = Integer.MaxValue
            Dim rowIni As Integer = Integer.MaxValue
            Dim colFin As Integer = Integer.MinValue
            Dim rowFin As Integer = Integer.MinValue
            Dim i As Integer = 0
            Dim j As Integer = 0

            Dim columnasIndex(gridDeDatos.SelectedCells.Count - 1) As Integer
            Dim renglonesIndex(gridDeDatos.SelectedCells.Count - 1) As Integer

            For Each celda As DataGridCellInfo In gridDeDatos.SelectedCells
                renglonesIndex(i) = gridDeDatos.Items.IndexOf(CType(celda.Item, COrden))
                columnasIndex(j) = celda.Column.DisplayIndex
                i += 1
                j += 1
            Next

            rowIni = renglonesIndex.Min()
            rowFin = renglonesIndex.Max()
            colIni = columnasIndex.Min()
            colFin = columnasIndex.Max()

            For i = rowIni To rowFin
                For j = colIni To colFin
                    If EsSeleccionadaLaCelda(gridDeDatos, i, j) Then
                        datos.Append(lstInterAux(i)(j).ToString() & vbTab)
                    Else
                        copiadoCorrecto = False
                        GoTo fuera
                    End If
                Next
                datos.Remove(datos.Length - 1, 1)
                datos.Append(vbLf)
            Next

            datos.Remove(datos.Length - 1, 1)

fuera:
            If copiadoCorrecto = True Then
                Clipboard.Clear()
                Clipboard.SetText(datos.ToString())
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Function EsSeleccionadaLaCelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer) As Boolean
        Try
            Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
            Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
            Dim objDepend As DependencyObject = cellContent
            Dim celda As DataGridCell = Nothing

            While Not objDepend Is Nothing
                If objDepend.GetType().Name = "DataGridCell" Then
                    celda = objDepend

                    If celda.IsSelected = True Then
                        Return True
                    Else
                        Return False
                    End If
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While

            Return False
        Catch ex As Exception
            Return False
        End Try
    End Function

    Private Sub pegarDatos(ByRef gridDeDatos As DataGrid)
        Dim lstInterAux As ObservableCollection(Of COrden) = gridDeDatos.ItemsSource
        Dim datos As CDatosEnFormatoX

        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

        '1) Validaciones: obtener información del portapapeles
        If datos.Datos.length = 0 Then
            Exit Sub
        End If

        If datos Is Nothing Then
            MessageBox.Show("No se pudo copiar los datos", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Validaciones: compatibilidad  
        Dim colTot As Integer = gridDeDatos.Columns.Count - 1
        Dim rowTot As Integer = gridDeDatos.Items.Count

        Dim colActual As Integer = gridDeDatos.SelectedCells.First.Column.DisplayIndex
        Dim rowActual As Integer = gridDeDatos.Items.IndexOf(CType(gridDeDatos.SelectedCells.First.Item, COrden))

        If colActual <> 15 Then

            'Validar renglones
            If datos.NumeroRenglones > ((rowTot - (rowActual + 1)) + 1) Then
                MessageBox.Show("No coinciden las dimensiones de datos a pegar (R)", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
                gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            End If

            If datos.NumeroColumnas.Max > ((colTot - (colActual + 1)) + 1) Then
                MessageBox.Show("No coinciden las dimensiones de datos a pegar (C), recuerde que la columna Mensaje solo es informativa", "Pegado datos", MessageBoxButton.OK, MessageBoxImage.Error)
                gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
                Exit Sub
            End If

            '2) Realizar copiado  
            Dim i As Integer = 0
            Dim j As Integer = 0

            Dim coontador As Integer = 0
            Dim limRow As Integer = (rowActual + (datos.NumeroRenglones - 1))

            gridDeDatos.UnselectAllCells()

            Try
                For i = rowActual To limRow
                    Dim limCol As Integer = (colActual + (datos.NumeroColumnas(coontador) - 1))

                    For j = colActual To limCol
                        If datos.Datos(i - rowActual)(j - colActual) <> vbLf Then 'And (Not CType(datos.Datos(i - rowActual)(j - colActual), String).Trim().Equals("")) Then
                            Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(i)
                            Dim cellContent As TextBlock = gridDeDatos.Columns(j).GetCellContent(row)

                            Dim auxImpDos As String = datos.Datos(i - rowActual)(j - colActual).ToString.Trim()

                            Try
                                If j = 4 Then
                                    auxImpDos = Convert.ToDouble(auxImpDos).ToString("###,##0")
                                ElseIf j = 8 Then
                                    If cmbTipo.SelectedIndex = 0 Then
                                        auxImpDos = Convert.ToDouble(auxImpDos).ToString("###,##0")
                                    ElseIf cmbTipo.SelectedIndex = 1 Then
                                        auxImpDos = Convert.ToDouble(auxImpDos).ToString("###,##0.00")
                                    End If
                                End If

                                cellContent.Text = auxImpDos
                                lstInterAux(i)(j) = auxImpDos
                            Catch ex As Exception
                                cellContent.Text = auxImpDos
                                lstInterAux(i)(j) = auxImpDos
                            End Try

                            seleccionarcelda(gridDeDatos, i, j)
                        End If
                    Next
                    coontador += 1
                Next
            Catch ex As Exception
                gridDeDatos.Items.Refresh()

                Throw New Exception("No se pudo terminar de copiar los datos debido a que no coinciden con el formato especificado para cada celda", ex)
            End Try
        End If
    End Sub

    Private Sub InsertarDatos(ByRef gridDeDatos As DataGrid)
        Dim lstInterAux As ObservableCollection(Of COrden) = gridDeDatos.ItemsSource
        Dim datos As CDatosEnFormatoX

        datos = CUtileria.ObtenerDatosClipboard(vbLf, vbTab)

        '1) Validaciones: obtener información del portapapeles
        If datos.Datos.length = 0 Then
            Exit Sub
        End If

        If datos Is Nothing Then
            MessageBox.Show("No se pudo copiar los datos", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        End If

        '2) Validaciones: compatibilidad  
        Dim colTot As Integer = gridDeDatos.Columns.Count - 1

        'Validar solo columnas
        If datos.NumeroColumnas.Max <> colTot Then
            MessageBox.Show("El número de columnas es incorrecto, favor de revisar la información copiada", "Insertado registros", MessageBoxButton.OK, MessageBoxImage.Error)
            gridDeDatos.CancelEdit(DataGridEditingUnit.Cell)
            Exit Sub
        Else
            Dim lstOrdenes As New ObservableCollection(Of COrden)

            lstOrdenes = grdOrdenes.ItemsSource

            For renglon = 0 To datos.NumeroRenglones - 1 Step 1
                Dim ordenI As New COrden()

                ordenI.Contrato = datos.Datos(renglon)(0).ToString().Trim()

                ordenI.TipoValor = datos.Datos(renglon)(1).ToString().Trim()

                ordenI.Emisora = datos.Datos(renglon)(2).ToString().Trim()

                ordenI.Serie = datos.Datos(renglon)(3).ToString().Trim()

                Try                    
                    ordenI.Titulos = Convert.ToDouble(datos.Datos(renglon)(4).ToString().Trim()).ToString("###,##0")
                Catch ex As Exception
                    ordenI.Titulos = datos.Datos(renglon)(4).ToString().Trim()
                End Try

                ordenI.TipoOperacion = datos.Datos(renglon)(5).ToString().Trim()

                ordenI.Precio = datos.Datos(renglon)(6).ToString().Trim()

                ordenI.LimitYield = datos.Datos(renglon)(7).ToString().Trim()

                Try
                    If cmbTipo.SelectedIndex = 0 Then
                        ordenI.Monto = Convert.ToDouble(datos.Datos(renglon)(8).ToString().Trim()).ToString("###,##0")
                    ElseIf cmbTipo.SelectedIndex = 1 Then
                        ordenI.Monto = Convert.ToDouble(datos.Datos(renglon)(8).ToString().Trim()).ToString("###,##0.00")
                    Else
                        ordenI.Monto = datos.Datos(renglon)(8).ToString().Trim()
                    End If
                Catch ex As Exception
                    ordenI.Monto = datos.Datos(renglon)(8).ToString().Trim()
                End Try

                ordenI.SecuritySN = datos.Datos(renglon)(9).ToString().Trim()

                ordenI.MaturityRange = datos.Datos(renglon)(10).ToString().Trim()

                ordenI.Mesa = datos.Datos(renglon)(11).ToString().Trim()

                ordenI.Estrategia = datos.Datos(renglon)(12).ToString().Trim()

                ordenI.Tasa = datos.Datos(renglon)(13).ToString().Trim()

                ordenI.FechaLiquidacion = datos.Datos(renglon)(14).ToString().Trim()

                ordenI.Mensaje = ""

                lstOrdenes.Add(ordenI)
            Next

            grdOrdenes.UpdateLayout()

            ValidaCantidadDatos()
        End If
    End Sub

    Private Sub seleccionarcelda(ByRef gridDeDatos As DataGrid, ByVal indexRow As Integer, ByVal indexCol As Integer)
        Dim row As DataGridRow = gridDeDatos.ItemContainerGenerator.ContainerFromIndex(indexRow)
        Dim cellContent As TextBlock = gridDeDatos.Columns(indexCol).GetCellContent(row)
        Dim objDepend As DependencyObject = cellContent
        Dim celda As DataGridCell = Nothing

        While Not objDepend Is Nothing
            If objDepend.GetType().Name = "DataGridCell" Then
                celda = objDepend

                If celda.IsSelected = False Then
                    celda.IsSelected = True
                    celda.Focus()
                    Exit While
                End If
            End If
            objDepend = VisualTreeHelper.GetParent(objDepend)
        End While
    End Sub

    Private Sub cmbTipo_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) Handles cmbTipo.SelectionChanged
        If blnCargada And blnCambioTipo Then
            Dim msgResultado As MessageBoxResult = MessageBox.Show("Si cambia de tipo perderá la información no procesada, ¿Desea continuar?", "Cambio tipo", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Dim lstOrdenesLimpia As New ObservableCollection(Of COrden)

                If cmbTipo.SelectedIndex = 0 Then
                    grdOrdenes.Columns(8).Header = "Nominal"
                ElseIf cmbTipo.SelectedIndex = 1 Then
                    grdOrdenes.Columns(8).Header = "Monto"
                End If

                lstOrdenesLimpia = grdOrdenes.ItemsSource
                lstOrdenesLimpia.Clear()
                grdOrdenes.UpdateLayout()

                ValidaCantidadDatos()
            Else
                Dim cAux As ComboBox = sender

                blnCambioTipo = False

                cAux.SelectedItem = e.RemovedItems(0)

                Return
            End If
        End If

        blnCambioTipo = True
    End Sub

    Private Sub btnCargaArchivo_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnCargaArchivo.Click
        Dim dlg As New Microsoft.Win32.OpenFileDialog()
        Dim blnArchivoElegido As Boolean

        If grdOrdenes.Items.Count > 0 Then
            Dim msgPregunta As MessageBoxResult = MessageBox.Show("Al cargar el archivo toda la información que se ha ingresado se perderá, ¿Desea continuar?", "Carga archivo", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgPregunta = MessageBoxResult.Yes Then
                GoTo continua
            Else
                Return
            End If
        Else
            GoTo continua
        End If

continua:
        Try
            dlg.FileName = ""
            dlg.DefaultExt = ".png"
            dlg.Filter = "Excel documents|*.xls;*.xlsx"

            blnArchivoElegido = dlg.ShowDialog()

            If blnArchivoElegido Then
                Dim lstOrdenes As New ObservableCollection(Of COrden)
                Dim wbk As Workbook
                Dim hoja As Worksheet
                Dim Aplicacion As _Application
                Dim rango As Range
                Dim indice As Integer = 0, indiceAux As Integer = 2, TotalRenglones As Integer, TotalColumnas As Integer
                Dim strNombreAuxiliar As String
                Dim intBitacoraCarga = CUtileria.GrabarBitacora("APIAssetAllocation", "CargarArchivo", "Carga de archivo Excel para API Asset Allocation")

                Mouse.OverrideCursor = Cursors.Wait

                lstOrdenes = grdOrdenes.ItemsSource
                lstOrdenes.Clear()
                grdOrdenes.UpdateLayout()

                Try
                    Aplicacion = GetObject(, "Excel.Application")
                Catch ex As Exception
                    Aplicacion = CreateObject("Excel.Application")
                End Try

                While indice >= 0
                    indice = dlg.FileName.IndexOf("\", indiceAux)

                    If indice > 0 Then
                        indiceAux = indice + 1
                    End If
                End While

                strNombreAuxiliar = dlg.FileName.Substring(indiceAux, dlg.FileName.Length - indiceAux)

                For Each wbAux As Workbook In Aplicacion.Workbooks
                    If wbAux.Name = strNombreAuxiliar Then
                        wbAux.Close()
                    End If
                Next

                Try
                    wbk = Aplicacion.Workbooks.Open(dlg.FileName)
                Catch ex As Exception
                    Dim intErrorAperturaArchivo As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "CargarArchivo", ex.Message)
                    CUtileria.CompletarRegBitacora(intErrorAperturaArchivo)

                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message & " Si esta modificando otro libro favor de terminar e intentar nuevamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)

                    Exit Sub
                End Try

                hoja = wbk.Sheets(1)

                rango = hoja.UsedRange

                TotalRenglones = rango.Rows.Count

                TotalColumnas = rango.Columns.Count

                If TotalColumnas <> 15 Then
                    wbk.Close()

                    CUtileria.CompletarRegBitacora(intBitacoraCarga)

                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("El número de columnas es incorrecto. Por favor verifique el archivo e intente subirlo nuevamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)
                Else
                    For renglon = 2 To TotalRenglones Step 1
                        Dim ordenExcel As New COrden()

                        If Not hoja.Cells(renglon, 1).Value2 Is Nothing Then
                            ordenExcel.Contrato = hoja.Cells(renglon, 1).Value2
                        Else
                            ordenExcel.Contrato = ""
                        End If

                        If Not hoja.Cells(renglon, 2).Value2 Is Nothing Then
                            ordenExcel.TipoValor = hoja.Cells(renglon, 2).Value2
                        Else
                            ordenExcel.TipoValor = ""
                        End If

                        If Not hoja.Cells(renglon, 3).Value2 Is Nothing Then
                            ordenExcel.Emisora = hoja.Cells(renglon, 3).Value2
                        Else
                            ordenExcel.Emisora = ""
                        End If

                        If Not hoja.Cells(renglon, 4).Value2 Is Nothing Then
                            ordenExcel.Serie = hoja.Cells(renglon, 4).Value2
                        Else
                            ordenExcel.Serie = ""
                        End If

                        If Not hoja.Cells(renglon, 5).Value2 Is Nothing Then
                            Try
                                ordenExcel.Titulos = Convert.ToDouble(hoja.Cells(renglon, 5).Value2).ToString("###,##0")
                            Catch ex As Exception
                                ordenExcel.Titulos = hoja.Cells(renglon, 5).Value2
                            End Try
                        Else
                            ordenExcel.Titulos = ""
                        End If

                        If Not hoja.Cells(renglon, 6).Value2 Is Nothing Then
                            ordenExcel.TipoOperacion = hoja.Cells(renglon, 6).Value2
                        Else
                            ordenExcel.TipoOperacion = ""
                        End If

                        If Not hoja.Cells(renglon, 7).Value2 Is Nothing Then
                            ordenExcel.Precio = hoja.Cells(renglon, 7).Value2
                        Else
                            ordenExcel.Precio = ""
                        End If

                        If Not hoja.Cells(renglon, 8).Value2 Is Nothing Then
                            ordenExcel.LimitYield = hoja.Cells(renglon, 8).Value2
                        Else
                            ordenExcel.LimitYield = ""
                        End If

                        If Not hoja.Cells(renglon, 9).Value2 Is Nothing Then
                            Try
                                If cmbTipo.SelectedIndex = 0 Then
                                    ordenExcel.Monto = Convert.ToDouble(hoja.Cells(renglon, 9).Value2).ToString("###,##0")
                                ElseIf cmbTipo.SelectedIndex = 1 Then
                                    ordenExcel.Monto = Convert.ToDouble(hoja.Cells(renglon, 9).Value2).ToString("###,##0.00")
                                Else
                                    ordenExcel.Monto = hoja.Cells(renglon, 9).Value2
                                End If
                            Catch ex As Exception
                                ordenExcel.Monto = hoja.Cells(renglon, 9).Value2
                            End Try
                        Else
                            ordenExcel.Monto = ""
                        End If

                        If Not hoja.Cells(renglon, 10).Value2 Is Nothing Then
                            ordenExcel.SecuritySN = hoja.Cells(renglon, 10).Value2
                        Else
                            ordenExcel.SecuritySN = ""
                        End If

                        If Not hoja.Cells(renglon, 11).Value2 Is Nothing Then
                            ordenExcel.MaturityRange = hoja.Cells(renglon, 11).Value2
                        Else
                            ordenExcel.MaturityRange = ""
                        End If

                        If Not hoja.Cells(renglon, 12).Value2 Is Nothing Then
                            ordenExcel.Mesa = hoja.Cells(renglon, 12).Value2
                        Else
                            ordenExcel.Mesa = ""
                        End If

                        If Not hoja.Cells(renglon, 13).Value2 Is Nothing Then
                            ordenExcel.Estrategia = hoja.Cells(renglon, 13).Value2
                        Else
                            ordenExcel.Estrategia = ""
                        End If

                        If Not hoja.Cells(renglon, 14).Value2 Is Nothing Then
                            ordenExcel.Tasa = hoja.Cells(renglon, 14).Value2
                        Else
                            ordenExcel.Tasa = ""
                        End If

                        If Not hoja.Cells(renglon, 15).Value Is Nothing Then
                            ordenExcel.FechaLiquidacion = hoja.Cells(renglon, 15).Value
                        Else
                            ordenExcel.FechaLiquidacion = ""
                        End If

                        ordenExcel.Mensaje = ""

                        lstOrdenes.Add(ordenExcel)
                    Next

                    wbk.Close()

                    grdOrdenes.UpdateLayout()

                    CUtileria.CompletarRegBitacora(intBitacoraCarga)

                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Archivo cargado correctamente", "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Information)
                End If

                ValidaCantidadDatos()
            End If
        Catch ex As Exception
            Dim intErrorDosArchivo As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "CargaArchivo", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDosArchivo)

            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Carga archivo", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub ValidaCantidadDatos()
        If grdOrdenes.Items.Count > 0 Then
            btnSubirDECALOG.IsEnabled = True
            btnEliminaOrden.IsEnabled = True
        Else
            btnSubirDECALOG.IsEnabled = False
            btnEliminaOrden.IsEnabled = False
        End If
    End Sub

    Private Sub btnInsertar_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnInsertar.Click
        Try
            InsertarDatos(Me.grdOrdenes)
        Catch ex As Exception
            MessageBox.Show("Error TI500. " & ex.Message, "Insertar registros", MessageBoxButton.OK, MessageBoxImage.Exclamation)
        End Try
    End Sub
#End Region

#Region "Carga DECALOG"
    Private Sub btnSubirDECALOG_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnSubirDECALOG.Click
        Dim msgResultado As MessageBoxResult
        Dim strRutaTLOADER As String
        Dim intBitacoraCargaDECALOG As Integer
        Dim lstOrdenesEvaluar As New ObservableCollection(Of COrden)

        lstOrdenesEvaluar = grdOrdenes.ItemsSource
        dtOrdenes.Clear()

        strRutaTLOADER = APIServicio.ObtieneRutaTLOADERAPI()

        If File.Exists(strRutaTLOADER) Then
            msgResultado = MessageBox.Show("¿Desea procesar los datos en DECALOG?", "Atención", MessageBoxButton.YesNo, MessageBoxImage.Question)

            If msgResultado = MessageBoxResult.Yes Then
                Mouse.OverrideCursor = Cursors.Wait

                Try
                    Dim strRutaDECALOG As String, strRutaDirectorio As String, strNombrePrefijo As String, strMensajeValidacion As String = String.Empty
                    Dim indice As Integer = 0, indiceAux As Integer = 2

                    If cmbTipo.SelectedIndex = 0 Then
                        APIServicio.ReglasLayout(TiposOrden.DeudaXRango, lstOrdenesEvaluar, strMensajeValidacion)
                    ElseIf cmbTipo.SelectedIndex = 1 Then
                        APIServicio.ReglasLayout(TiposOrden.Monto, lstOrdenesEvaluar, strMensajeValidacion)
                    ElseIf cmbTipo.SelectedIndex = 2 Then
                        APIServicio.ReglasLayout(TiposOrden.Nominal, lstOrdenesEvaluar, strMensajeValidacion)
                    End If

                    If strMensajeValidacion.Length = 0 Then
                        strRutaDECALOG = APIServicio.ObtieneRutaArchivoAPI()

                        While indice >= 0
                            indice = strRutaDECALOG.IndexOf("\", indiceAux)

                            If indice > 0 Then
                                indiceAux = indice + 1
                            End If
                        End While

                        strRutaDirectorio = strRutaDECALOG.Substring(0, indiceAux - 1)
                        strNombrePrefijo = strRutaDECALOG.Substring(indiceAux, strRutaDECALOG.Length - indiceAux)

                        If Directory.Exists(strRutaDirectorio) Then
                            Try
                                Dim strConstructor As StringBuilder = New StringBuilder()

                                Dim ExistenErrores = From dato In lstOrdenesEvaluar Where dato.Mensaje.Length > 0 Select dato

                                If ExistenErrores.Count > 0 Then
                                    Mouse.OverrideCursor = Nothing

                                    grdOrdenes.Items.Refresh()

                                    Dim msgPregunta As MessageBoxResult = MessageBox.Show("Existen algunos registros con errores, por lo que algunas órdenes globales podrían no mandarse hasta que los datos sean corregidos, ¿Desea continuar?", "Carga DECALOG", MessageBoxButton.YesNo, MessageBoxImage.Question)

                                    If msgPregunta = MessageBoxResult.Yes Then
                                        GoTo termina
                                    Else
                                        Exit Sub
                                    End If
                                Else
                                    GoTo termina
                                End If

termina:
                                Mouse.OverrideCursor = Cursors.Wait

                                intBitacoraCargaDECALOG = CUtileria.GrabarBitacora("APIAssetAllocation", "Carga a DECALOG", "Se genera archivo y se carga a DECALOG mediante el TLOADER en " + strRutaDECALOG)

                                If cmbTipo.SelectedIndex = 0 Then
                                    For Each ordL As COrden In lstOrdenesEvaluar
                                        ordL.Emisora = ""
                                        ordL.Serie = ""
                                    Next
                                End If

                                Dim InstrumentosErroneos = (From dato In lstOrdenesEvaluar Where dato.Mensaje.Length > 0 Select dato.TipoValor, dato.Emisora, dato.Serie).Distinct()
                                Dim ordenesEliminar As New ObservableCollection(Of COrden)

                                If InstrumentosErroneos.Count > 0 Then
                                    For Each ordAux In InstrumentosErroneos
                                        For Each ordTemp In lstOrdenesEvaluar
                                            If ordTemp.TipoValor = ordAux.TipoValor And ordTemp.Emisora = ordAux.Emisora And ordTemp.Serie = ordAux.Serie And cmbTipo.SelectedIndex > 0 Then
                                                ordenesEliminar.Add(ordTemp)
                                            ElseIf ordTemp.TipoValor = ordAux.TipoValor And cmbTipo.SelectedIndex = 0 Then
                                                ordenesEliminar.Add(ordTemp)
                                            End If
                                        Next
                                    Next

                                    For Each T As COrden In ordenesEliminar
                                        lstOrdenesEvaluar.Remove(T)
                                    Next
                                End If

                                grdOrdenes.ItemsSource = ordenesEliminar
                                grdOrdenes.UpdateLayout()

                                If lstOrdenesEvaluar.Count > 0 Then
                                    Dim contador As Integer = 1
                                    Dim dtEquivalenciaTO As System.Data.DataTable = APIServicio.ObtieneParametrosAPI(cmbTipo.SelectedIndex + 1)
                                    Dim strOrdTypeAlrt As String, strOrdType As String

                                    dtCabecera = APIServicio.ObtieneFormatoAPI(cmbTipo.SelectedIndex + 1, 1)
                                    dtDetalle = APIServicio.ObtieneFormatoAPI(cmbTipo.SelectedIndex + 1, 2)

                                    dtCabecera.Columns(1).ReadOnly = False
                                    dtDetalle.Columns(1).ReadOnly = False

                                    Dim drAuxOrdTyp As DataRow() = dtCabecera.Select("ORDEN = 8")

                                    strOrdType = drAuxOrdTyp(0)(1).ToString()
                                    strOrdTypeAlrt = APIServicio.ObtieneOrderTypeAlternativo()

                                    If cmbTipo.SelectedIndex = 0 Then
                                        Dim strIdAPI As String = APIServicio.ObtieneIDAPIDeudaRangos(), strPais As String
                                        Dim dtCampos As System.Data.DataTable = APIServicio.ObtieneCamposAPIDeudaRangos(strIdAPI)
                                        Dim InstrumentosOKRango = (From dato In lstOrdenesEvaluar Select dato.TipoValor, dato.TipoOperacion, dato.MaturityRange, dato.SecuritySN, dato.Mesa, dato.Estrategia, dato.FechaLiquidacion, dato.Tasa, dato.LimitYield).Distinct()

                                        dtPie = APIServicio.ObtieneFormatoAPI(cmbTipo.SelectedIndex + 1, 3)
                                        dtPie.Columns(1).ReadOnly = False

                                        Dim drAuxPais As DataRow() = dtPie.Select("ORDEN = 2")

                                        strPais = drAuxPais(0)(1).ToString()                                        

                                        For Each instAuxRango In InstrumentosOKRango
                                            Dim drAuxTO As DataRow() = dtEquivalenciaTO.Select("PARAMETRO_VALOR = '" & instAuxRango.TipoOperacion & "'")

                                            If drAuxTO.Count > 0 Then
                                                ActualizaFormatoAPI(1, drAuxTO(0)(1).ToString(), 1)
                                            Else
                                                ActualizaFormatoAPI(1, instAuxRango.TipoOperacion, 1)
                                            End If

                                            ActualizaFormatoAPI(1, strIdAPI, 2)

                                            ActualizaFormatoAPI(1, instAuxRango.Mesa, 3)

                                            ActualizaFormatoAPI(1, instAuxRango.Estrategia, 4)

                                            ActualizaFormatoAPI(1, instAuxRango.FechaLiquidacion, 5)

                                            If instAuxRango.LimitYield.Length > 0 And instAuxRango.Tasa.Length > 0 Then
                                                ActualizaFormatoAPI(1, instAuxRango.Tasa, 6)

                                                ActualizaFormatoAPI(1, "", 7)                                            
                                            Else
                                                ActualizaFormatoAPI(1, instAuxRango.Tasa, 6)

                                                ActualizaFormatoAPI(1, instAuxRango.LimitYield, 7)
                                            End If

                                            If instAuxRango.LimitYield.Length = 0 And instAuxRango.Tasa.Length = 0 Then
                                                ActualizaFormatoAPI(1, strOrdTypeAlrt, 8)
                                            Else
                                                ActualizaFormatoAPI(1, strOrdType, 8)
                                            End If

                                            ProcesaDatos(1, contador)

                                            For Each ordTempRango In lstOrdenesEvaluar
                                                If ordTempRango.TipoValor = instAuxRango.TipoValor And ordTempRango.TipoOperacion = instAuxRango.TipoOperacion And ordTempRango.MaturityRange = instAuxRango.MaturityRange And ordTempRango.SecuritySN = instAuxRango.SecuritySN And ordTempRango.Mesa = instAuxRango.Mesa And ordTempRango.Estrategia = instAuxRango.Estrategia And ordTempRango.FechaLiquidacion = instAuxRango.FechaLiquidacion And ordTempRango.Tasa = instAuxRango.Tasa And ordTempRango.LimitYield = instAuxRango.LimitYield Then
                                                    ActualizaFormatoAPI(2, ordTempRango.Contrato, 1)
                                                    ActualizaFormatoAPI(2, Math.Abs(Convert.ToDouble(ordTempRango.Monto)).ToString(), 2)

                                                    ProcesaDatos(2, contador)
                                                End If
                                            Next

                                            For Each drAux In dtCampos.Rows
                                                ActualizaFormatoAPI(3, drAux(2), 1)

                                                If (Convert.ToInt32(drAux(0)) = 1) Then
                                                    ActualizaFormatoAPI(3, instAuxRango.TipoValor, 2)
                                                ElseIf (Convert.ToInt32(drAux(0)) = 2) Then
                                                    ActualizaFormatoAPI(3, instAuxRango.MaturityRange, 2)
                                                ElseIf (Convert.ToInt32(drAux(0)) = 3) Then
                                                    ActualizaFormatoAPI(3, instAuxRango.SecuritySN, 2)
                                                ElseIf (Convert.ToInt32(drAux(0)) = 4) Then
                                                    ActualizaFormatoAPI(3, strPais, 2)
                                                End If

                                                ProcesaDatos(3, contador)
                                            Next

                                            contador = contador + 1
                                        Next
                                    ElseIf cmbTipo.SelectedIndex = 1 Then
                                        Dim InstrumentosOK = (From dato In lstOrdenesEvaluar Select dato.TipoValor, dato.Emisora, dato.Serie, dato.TipoOperacion, dato.LimitYield, dato.Mesa, dato.Estrategia, dato.FechaLiquidacion, dato.Tasa).Distinct()

                                        For Each instAux In InstrumentosOK
                                            Dim drAuxTO As DataRow() = dtEquivalenciaTO.Select("PARAMETRO_VALOR = '" & instAux.TipoOperacion & "'")

                                            If drAuxTO.Count > 0 Then
                                                ActualizaFormatoAPI(1, drAuxTO(0)(1).ToString(), 1)
                                            Else
                                                ActualizaFormatoAPI(1, instAux.TipoOperacion, 1)
                                            End If

                                            ActualizaFormatoAPI(1, instAux.TipoValor & instAux.Emisora & instAux.Serie, 2)

                                            ActualizaFormatoAPI(1, instAux.Mesa, 4)
                                            ActualizaFormatoAPI(1, instAux.Estrategia, 5)
                                            ActualizaFormatoAPI(1, instAux.FechaLiquidacion, 6)

                                            If instAux.LimitYield.Length > 0 And instAux.Tasa.Length > 0 Then
                                                ActualizaFormatoAPI(1, instAux.Tasa, 7)
                                                ActualizaFormatoAPI(1, "", 3)                                                
                                            Else
                                                ActualizaFormatoAPI(1, instAux.Tasa, 7)
                                                ActualizaFormatoAPI(1, instAux.LimitYield, 3)
                                            End If

                                            If instAux.LimitYield.Length = 0 And instAux.Tasa.Length = 0 Then
                                                ActualizaFormatoAPI(1, strOrdTypeAlrt, 8)
                                            Else
                                                ActualizaFormatoAPI(1, strOrdType, 8)
                                            End If

                                            ProcesaDatos(1, contador)

                                            For Each ordTemporal In lstOrdenesEvaluar
                                                If ordTemporal.TipoValor = instAux.TipoValor And ordTemporal.Emisora = instAux.Emisora And ordTemporal.Serie = instAux.Serie And ordTemporal.TipoOperacion = instAux.TipoOperacion And ordTemporal.LimitYield = instAux.LimitYield And ordTemporal.Mesa = instAux.Mesa And ordTemporal.Estrategia = instAux.Estrategia And ordTemporal.FechaLiquidacion = instAux.FechaLiquidacion And ordTemporal.Tasa = instAux.Tasa Then
                                                    ActualizaFormatoAPI(2, ordTemporal.Contrato, 1)
                                                    ActualizaFormatoAPI(2, Math.Abs(Convert.ToDouble(ordTemporal.Monto)).ToString(), 2)

                                                    ProcesaDatos(2, contador)
                                                End If
                                            Next

                                            contador = contador + 1
                                        Next
                                    ElseIf cmbTipo.SelectedIndex = 2 Then
                                        Dim InstrumentosOKNom = (From dato In lstOrdenesEvaluar Select dato.TipoValor, dato.Emisora, dato.Serie, dato.TipoOperacion, dato.LimitYield, dato.Mesa, dato.Estrategia, dato.FechaLiquidacion, dato.Tasa).Distinct()

                                        For Each instAuxNom In InstrumentosOKNom
                                            Dim drAuxTONom As DataRow() = dtEquivalenciaTO.Select("PARAMETRO_VALOR = '" & instAuxNom.TipoOperacion & "'")

                                            If drAuxTONom.Count > 0 Then
                                                ActualizaFormatoAPI(1, drAuxTONom(0)(1).ToString(), 1)
                                            Else
                                                ActualizaFormatoAPI(1, instAuxNom.TipoOperacion, 1)
                                            End If

                                            ActualizaFormatoAPI(1, instAuxNom.TipoValor & instAuxNom.Emisora & instAuxNom.Serie, 2)

                                            ActualizaFormatoAPI(1, instAuxNom.Mesa, 4)
                                            ActualizaFormatoAPI(1, instAuxNom.Estrategia, 5)
                                            ActualizaFormatoAPI(1, instAuxNom.FechaLiquidacion, 6)                                            

                                            If instAuxNom.LimitYield.Length > 0 And instAuxNom.Tasa.Length > 0 Then
                                                ActualizaFormatoAPI(1, instAuxNom.Tasa, 7)
                                                ActualizaFormatoAPI(1, "", 3)
                                            Else
                                                ActualizaFormatoAPI(1, instAuxNom.Tasa, 7)
                                                ActualizaFormatoAPI(1, instAuxNom.LimitYield, 3)
                                            End If

                                            If instAuxNom.LimitYield.Length = 0 And instAuxNom.Tasa.Length = 0 Then
                                                ActualizaFormatoAPI(1, strOrdTypeAlrt, 8)
                                            Else
                                                ActualizaFormatoAPI(1, strOrdType, 8)
                                            End If

                                            ProcesaDatos(1, contador)

                                            For Each ordTemporalNom In lstOrdenesEvaluar
                                                If ordTemporalNom.TipoValor = instAuxNom.TipoValor And ordTemporalNom.Emisora = instAuxNom.Emisora And ordTemporalNom.Serie = instAuxNom.Serie And ordTemporalNom.TipoOperacion = instAuxNom.TipoOperacion And ordTemporalNom.LimitYield = instAuxNom.LimitYield And ordTemporalNom.Mesa = instAuxNom.Mesa And ordTemporalNom.Estrategia = instAuxNom.Estrategia And ordTemporalNom.FechaLiquidacion = instAuxNom.FechaLiquidacion And ordTemporalNom.Tasa = instAuxNom.Tasa Then
                                                    ActualizaFormatoAPI(2, ordTemporalNom.Contrato, 1)
                                                    ActualizaFormatoAPI(2, Math.Abs(Convert.ToDouble(ordTemporalNom.Titulos)).ToString(), 2)

                                                    ProcesaDatos(2, contador)
                                                End If
                                            Next

                                            contador = contador + 1
                                        Next
                                    End If

                                    Dim NombreFinalArchivo As String = GeneraArchivo(strRutaDirectorio, strNombrePrefijo)
                                    Dim Parametros As String

                                    Parametros = APIServicio.ObtieneParametrosTLOADER().Replace("@CSMode", "STOP").Replace("@Usuario", CServiciosMacrosSyBaseDB.USUARIO).Replace("@Archivo", NombreFinalArchivo)

                                    Dim intInsercionBitacoraDECALOG As Integer = APIServicio.InsertaBitacoraDECALOG(NombreFinalArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                    If intInsercionBitacoraDECALOG > 0 Then
                                        servGrales.EjecutarProceso(strRutaTLOADER, Parametros, "APIAssetAllocation")

                                        Thread.Sleep(7000)

                                        Dim intVerificacionArchivo As Integer = VerificaArchivoDECALOG(NombreFinalArchivo)

                                        CUtileria.CompletarRegBitacora(intBitacoraCargaDECALOG)

                                        If intVerificacionArchivo = 1 Then
                                            APIServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            tabCompliance.IsEnabled = False

                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Operacion realizada con Exito!!. Folio(s) generado(s): " & strFolios, "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Information)
                                        ElseIf intVerificacionArchivo = 2 Then
                                            APIServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Se han encontrado errores o reglas transgedidas", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Error)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabCarga.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        ElseIf intVerificacionArchivo = 0 Then
                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("No se obtuvo respuesta de DECALOG, favor de revisar la bitácora de folios para ver el resultado de la operación.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Warning)
                                        ElseIf intVerificacionArchivo = 3 Then
                                            APIServicio.ActualizaBitacoraDECALOG(intInsercionBitacoraDECALOG, intVerificacionArchivo, CServiciosMacrosSyBaseDB.IDUSUARIO)

                                            Dim strFolios = ActualizaFolioDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            Mouse.OverrideCursor = Nothing

                                            MessageBox.Show("Archivo parcialmente correcto con los folios: " & strFolios & ". También se encontraron errores o reglas transgedidas.", "Generación de órdenes", MessageBoxButton.OK, MessageBoxImage.Warning)

                                            Thread.Sleep(1000)

                                            ActualizaErrorDECALOG(NombreFinalArchivo, intInsercionBitacoraDECALOG)

                                            Dim strContenido As String = File.ReadAllText(NombreFinalArchivo + ".err_text")

                                            tbErrores.Text = strContenido

                                            tabCompliance.IsEnabled = True
                                            tabCarga.IsSelected = False
                                            tabCompliance.IsSelected = True
                                        End If
                                    Else
                                        Mouse.OverrideCursor = Nothing

                                        MessageBox.Show("Ocurrió un error al guardar el envío del archivo en la bitácora", "Generación órdenes", MessageBoxButton.OK, MessageBoxImage.Error)
                                    End If
                                Else
                                    CUtileria.CompletarRegBitacora(intBitacoraCargaDECALOG)

                                    Mouse.OverrideCursor = Nothing

                                    MessageBox.Show("No hay órdenes válidas para ser mandadas a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)

                                    Exit Sub
                                End If
                            Catch ex As Exception
                                Dim intErrorCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "Carga a DECALOG", ex.Message)
                                CUtileria.CompletarRegBitacora(intErrorCargaArchivoDecalog)

                                Mouse.OverrideCursor = Nothing

                                MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                            End Try
                        Else
                            Mouse.OverrideCursor = Nothing

                            MessageBox.Show("Verificar que existe la ruta: " + strRutaDirectorio + " para almacenar el archivo a procesar en DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                        End If
                    Else
                        Mouse.OverrideCursor = Nothing

                        MessageBox.Show("Ocurrió un error al validar la información", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                    End If
                Catch ex As Exception
                    Dim intErrorDosCargaArchivoDecalog As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "Carga a DECALOG", ex.Message)
                    CUtileria.CompletarRegBitacora(intErrorDosCargaArchivoDecalog)

                    Mouse.OverrideCursor = Nothing

                    MessageBox.Show("Error TI500. " & ex.Message, "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
                End Try
            End If
        Else
            MessageBox.Show("Verificar que existe el archivo: " + strRutaTLOADER + " para poder cargar los archivos a DECALOG", "Carga DECALOG", MessageBoxButton.OK, MessageBoxImage.Error)
        End If
    End Sub

    Private Sub ActualizaFormatoAPI(ByVal intSubtipo As Integer, ByVal strDato As String, ByVal intOrden As Integer)
        If intSubtipo = 1 Then
            For Each drAux As DataRow In dtCabecera.Rows
                If Convert.ToInt32(drAux(2)) = intOrden Then
                    drAux(1) = strDato
                End If
            Next
        ElseIf intSubtipo = 2 Then
            For Each drAux As DataRow In dtDetalle.Rows
                If Convert.ToInt32(drAux(2)) = intOrden Then
                    drAux(1) = strDato
                End If
            Next
        ElseIf intSubtipo = 3 Then
            For Each drAux As DataRow In dtPie.Rows
                If Convert.ToInt32(drAux(2)) = intOrden Then
                    drAux(1) = strDato
                End If
            Next
        End If
    End Sub

    Private Sub ProcesaDatos(ByVal intSubtipo As Integer, ByVal intContador As Integer)
        If intSubtipo = 1 Then
            For Each drOrdFin As DataRow In dtCabecera.Rows
                If (Convert.ToBoolean(drOrdFin(3).ToString()) = True And drOrdFin(1).ToString.Length > 0) Or (Convert.ToBoolean(drOrdFin(3).ToString()) = False) Then
                    Dim drNuevo As DataRow = dtOrdenes.NewRow()

                    drNuevo(0) = intContador
                    drNuevo(1) = drOrdFin(0)
                    drNuevo(2) = drOrdFin(1)

                    dtOrdenes.Rows.Add(drNuevo)
                    dtOrdenes.AcceptChanges()
                End If
            Next
        ElseIf intSubtipo = 2 Then
            For Each drOrdFin As DataRow In dtDetalle.Rows

                Dim drNuevo As DataRow = dtOrdenes.NewRow()

                drNuevo(0) = intContador
                drNuevo(1) = drOrdFin(0)
                drNuevo(2) = drOrdFin(1)

                dtOrdenes.Rows.Add(drNuevo)
                dtOrdenes.AcceptChanges()
            Next
        ElseIf intSubtipo = 3 Then
            For Each drOrdFin As DataRow In dtPie.Rows

                Dim drNuevo As DataRow = dtOrdenes.NewRow()

                drNuevo(0) = intContador
                drNuevo(1) = drOrdFin(0)
                drNuevo(2) = drOrdFin(1)

                dtOrdenes.Rows.Add(drNuevo)
                dtOrdenes.AcceptChanges()
            Next
        End If

    End Sub

    Private Function GeneraArchivo(ByVal strRutaDirectorio As String, ByVal strNombrePrefijo As String) As String
        Dim strConstructor As StringBuilder = New StringBuilder()
        Dim strNombreFinalArchivo As String

        For Each dr As DataRow In dtOrdenes.Rows
            strConstructor.Append(dr(0) + vbTab + dr(1) + vbTab + dr(2) + vbNewLine)
        Next

        strNombreFinalArchivo = strRutaDirectorio + "\" + servGrales.ObtenerPREFIJOARCHIVO + strNombrePrefijo + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".tl"

        Dim swAux As StreamWriter = New StreamWriter(strNombreFinalArchivo)

        swAux.WriteLine(strConstructor)

        swAux.Close()

        Return strNombreFinalArchivo
    End Function

    Private Function VerificaArchivoDECALOG(ByVal strArchivo As String) As Integer
        Try
            Dim intSegundos As Integer = servGrales.ObtieneSegundosEspera()
            Dim intContador As Integer = 1
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            While (intContador <= intSegundos)
                If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                    Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                    Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                    Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                    Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                    If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                        Return 1
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                        Return 2
                    ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                        Return 3                    
                    End If
                End If

                Thread.Sleep(1000)

                intContador += 1
            End While

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Function ActualizaFolioDECALOG(ByVal strArchivo As String, ByVal intId As Integer) As String
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer, finIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()

                        inicioIdx = strAux.IndexOf("=")
                        finIdx = strAux.IndexOf("(")

                        If inicioIdx > 0 And finIdx > 0 Then
                            strFolio = strFolio + strAux.Substring(inicioIdx + 1, finIdx - inicioIdx - 1).Trim() + ","
                        End If

                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If

                    APIServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return strFolio
                Else
                    APIServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return "Archivo sin información"
                End If
            Else
                Return "No se encontró el archivo"
            End If
        Catch ex As Exception
            Dim intErrorFolioDECALOG As Integer = CUtileria.GrabarBitacora("ReportingBancomer", "ActualizarFolioDecalog", "Ocurrió un error al obtener el folio de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorFolioDECALOG)

            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)

            Return ""
        End Try
    End Function

    Private Sub ActualizaErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".err_text", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)

                    APIServicio.ActualizaMensajeErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    APIServicio.ActualizaMensajeErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorDECALOG As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "ActualizarErrorDecalog", "Ocurrió un error al obtener el mensaje de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDECALOG)

            Mouse.OverrideCursor = Nothing

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub grdOrdenes_LoadingRow(sender As System.Object, e As System.Windows.Controls.DataGridRowEventArgs) Handles grdOrdenes.LoadingRow
        Try
            Dim ordAux As COrden = DirectCast(e.Row.DataContext, COrden)

            If ordAux.Mensaje.Length > 0 Then
                e.Row.Background = New SolidColorBrush(Colors.OrangeRed)
                e.Row.Foreground = New SolidColorBrush(Colors.White)
            End If
        Catch ex As Exception
        End Try
    End Sub
#End Region
End Class
